package items

import (
	"server/share/config"

	"github.com/hwcer/cosgo"
	"github.com/hwcer/cosgo/random"
	"github.com/hwcer/yyds/context"
)

func init() {
	cosgo.On(cosgo.EventTypStarted, func() error {
		Register(config.Data.ItemUse.Chest, chest)
		Register(config.Data.ItemUse.Choice, choice)
		Register(config.Data.ItemUse.Wheel, wheel)
		return nil
	})

}

// chest 打开宝箱，不需要额外参数,args应该配置随机组
func chest(c *context.Context, args *Args, vs ...int32) (any, error) {
	if len(vs) == 0 {
		return nil, c.Error("config args error")
	}
	c.Player.AddItems(vs[0], args.Num)
	return true, nil
}

// choice 选择道具，Attach： 配置中args索引，需要多选的数量必须匹配
func choice(c *context.Context, args *Args, vs ...int32) (any, error) {
	if len(args.Attach) == 0 {
		return nil, c.Error("args attach empty")
	}
	if len(vs) == 0 {
		return nil, c.Error("config args error")
	}
	id := vs[0]
	use := int32(0)
	for _, v := range args.Attach {
		use += v
	}
	if use != args.Num {
		return nil, c.Error("选择的物品数量和使用的物品数量不匹配")
	}
	rdm := config.GetItemRandom()
	if rdm == nil {
		return nil, c.Error("GetItemRandom error")
	}
	options := map[int32]int32{}
	w := rdm.Group[id]
	if w == nil {
		return nil, c.Errorf(0, "GetItemRandom error:%d", id)
	}
	w.Range(func(k int32, _ int32) bool {
		if itemGroup := config.Data.ItemGroup[k]; itemGroup != nil {
			options[itemGroup.Key] = itemGroup.Num
		}
		return true
	})
	for k, v := range args.Attach {
		if n, ok := options[k]; !ok {
			return nil, c.Errorf(0, "choose item not exist:%d", k)
		} else {
			c.Player.Add(k, v*n)
		}
	}
	return nil, nil
}

// wheel 大转盘每次只能开一个
// num ,id
func wheel(c *context.Context, args *Args, vs ...int32) (any, error) {
	if len(vs) < 2 {
		return nil, c.Error("config args error")
	}
	n := vs[0]
	id := vs[1]
	ir := config.GetItemRandom()
	if ir == nil {
		return nil, c.Error("config itemRandom error")
	}
	group := ir.Group[id]
	if group == nil {
		return nil, c.Errorf(0, "item group not exist:%d", id)
	}

	gs := group.Multi(int(n))
	rdm := random.Random{}
	for _, k := range gs {
		if g := config.Data.ItemGroup[k]; g != nil {
			rdm.Add(g.Id, g.Val)
		}
	}
	ret := rdm.Sort().Roll()
	if ret <= 0 {
		return nil, c.Error("config error")
	}
	g := config.Data.ItemGroup[ret]
	c.Player.Add(g.Key, g.Num)
	return map[string]any{"reward": ret, "items": gs}, nil
}
